<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>

  <script>
    /*
      回顾

      1. 作用域
        + 就是一个变量(变量名/函数名) 的生效范围
        + 作用域分类
          => 全局作用域: 一个 html 页面就是一个全局作用域
          => 私有作用域: 只有函数生成私有作用域
        + 变量定义机制
          => 定义在哪一个作用域下的变量, 只能在当前作用域
          => 以及后代作用域内生效
        + 变量访问机制
          => 当你需要访问一个变量的值的时候
          => 首先在自己作用域内查找, 如果有直接使用, 停止查找
          => 如果没有, 去到父级作用域查找, 如果有直接使用, 停止查找
          => 如果还没有, 就再去父级作用域查找
          => 以此类推, 直到全局作用域(window) 都没有, 就报错: xxx is not defined
        + 变量赋值机制
          => 当你需要给一个变量赋值的时候
          => 首先在自己作用域内查找, 如果有, 直接赋值, 停止查找
          => 如果没有, 去到父级作用域内查找, 如果有, 直接赋值, 停止查找
          => 以此类推, 直到全局作用域都没有
          => 会把这个变量定义为全局变量在进行赋值

      2. 预解析
        + 在所有代码执行之前, 对代码进行通读并解释
        + 解析内容
          => 对 var 关键字进行解析, 对变量进行声明但是不赋值
          => 对声明式函数进行解析, 对变量名(函数名) 进行声明, 并且赋值为一个函数
        + 函数内代码的预解析, 是在函数执行的时候, 才会进行
        + 注意:
          => if 的条件不管是否成立, 都会进行预解析
          => 函数内 return 后面的代码虽然不会执行, 但是会进行预解析

      3. 对象数据类型 - Object
        3-1. 创建对象
          => 字面量方式
            -> 创建空对象: var obj = {}
            -> 创建带有数据的对象: var obj = { 键值对, key: value }
          => 内置构造函数方式
            -> 创建空对象: var obj = new Object()
        3-2. 对象的基本操作
          => 点语法
            -> 增: 对象名.键名 = 值
            -> 删: delete 对象名.键名
            -> 改: 对象名.键名 = 值(原先有就是修改, 原先没有就是增加)
            -> 查: 对象名.键名
          => 数组关联语法
            -> 增: 对象名['键名'] = 值
            -> 删: delete 对象名['键名']
            -> 改: 对象名['键名'] = 值(原先有就是修改, 原先没有就是增加)
            -> 查: 对象名['键名']
        3-3. 对象内 键名 的命名
          => 推荐是符合变量命名规则和规范的名字
          => 可以使用纯数字当做键名
          => 可以使用其他符号当做键名, 但是书写的时候需要被引号包裹
        3-4. 两种对象操作语法的区别
          => 操作符合变量命名规则和规范的名字的时候, 没有区别
          => 操作纯数字 和 带有特殊符号的名字的时候, 只能使用数组关联语法
          => 涉及变量操作的时候, 只能使用数组关联语法

      4. 数组数据类型 - Array
        4-1. 创建数组的方式
          => 字面量方式
            -> 创建空数组: var arr = []
            -> 创建带有数据的数组: var arr = [ 数据1, 数据2, 数据3, ... ]
          => 内置构造函数方式
            -> 创建空数组: var arr = new Array()
            -> 创建带有数据的数组: var arr = new Array( 数据1, 数据2, 数据3, ... )
            -> 创建指定长度的数组: var arr = new Array( 数字 )
        4-2. 数组的基本操作
          => length 属性
            -> 读写的属性
            -> 读
              + 语法: 数组名.length 或者 数组名['length']
              + 得到: 数组的长度, 也就是数组中有多少个数据, 是一个 Number 类型
            -> 写:
              + 语法: 数组名.length = 数字
              + 设置:
                => 当你设置的 length 小于原先 length 的时候, 从后面开始删除数据
                => 当你设置的 length 等于原先 length 的时候, 相当于没有设置
                => 当你设置的 length 大于原先 length 的时候, 空的位置使用 empty 补齐
          => 索引属性
            -> 读写的属性
            -> 读
              + 语法: 数组名[索引]
              + 得到:
                => 如果数组有该索引位置, 那么就是该索引位置的数据
                => 如果数组没有该索引位置, 那么得到的是 undefined
            -> 写:
              + 语法: 数组名[索引] = 值
              + 设置:
                => 如果数组本身有该索引位置, 那么就是替换该索引位置的数据
                => 如果设置的索引刚好和 length 一样, 那么就是追加数据
                => 如果设置的索引超过 length 的大小, 那么中间空余位置使用 empty 补齐(为了保证数组最后一位的索引一定是 length - 1)
          => 遍历
            -> 因为数组内数据的排列是一组有规律的数字
            -> 又因为循环可以给我们提供一组有规律的数字
            -> 我们就可以使用循环遍历数组, 使用循环控制变量充当索引依次访问
    */


  </script>
</body>
</html>
